import settings from "@/config/settings";
import store from "@/store";
let ajaxTimes = 0;

// 是否正在刷新的标记
let isRefreshToken = false
// 重试队列，每一项将是一个待执行的函数形式
let requestList = []



// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		config.baseURL = settings.IS_DEV ? settings.DEV_URL : settings.PRO_URL; /* 根域名 */
		config.custom.auth = true;
		config.custom.loading = true;
		return config
	})

	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		ajaxTimes++;
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		// let shaParam
		// if (config.method == 'GET') {
		// 	shaParam = config.params
		// } else {
		// 	shaParam = config.data
		// }

		config.data = config.data || {};

		if (config?.custom?.loading) {
			store.commit("setLoadingShow", true);
		}
		// 根据custom参数中配置的是否需要token，添加对应的请求头
		if (config?.custom?.auth) {
			// 可以在此通过vm引用vuex中的变量，具体值在vm.$store.state中
			// config.header.token = vm.$store.state.userInfo.token
			config.header['Authorization'] = uni.getStorageSync('token')
		}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {
		ajaxTimes--;
		if (ajaxTimes == 0) {
			store.commit("setLoadingShow", false);
			ajaxTimes = 0;
		}
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		// 自定义参数
		const custom = response.config?.custom;
		if (data.code == 0) {
			// token自动续期
			// 小程序的token是自动续签的，你这边需要检测 header  是否有 Automatic-Renewal-Token     Automatic-Renewal-Token-RefreshAt 头信息 有的话下次请求需要带上最新的token
			// if (response.headers && response.headers['Automatic-Renewal-Token']) {
			// 	let access_token = response.headers['Automatic-Renewal-Token'];
			// 	if (access_token) {
			// 		vm.$store.commit('setUserInfo', { token: access_token })
			// 		uni.setStorageSync('token', access_token)
			// 	}
			// }
			if (data.show == 1) {
				uni.$u.toast(data.msg)
			}
			return data.data == undefined ? {} : data
		} else if (data.code == -1) {
			uni.$u.toast(data.msg);
			uni.clearStorage();
			uni.reLaunch({
				url: '/pages/login/index'
			})
		} else {
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			uni.$u.toast(data.msg)
			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => {})
			}
		}


	}, (response) => {
		ajaxTimes = 0;
		// 关闭加载动画
		store.commit("setLoadingShow", false);
		// 对响应错误做点什么 （statusCode !== 200）
		let errorData = '请检查网络或服务器'
		let message = response.message || response.msg
		if (message == "request:fail url not in domain list") {
			errorData = '检查请求域名是否添加了域名白名单'
		} else if (message == 'request:fail timeout') {
			errorData = '请求超时:请检查网络'
		} else {
			errorData = message || '请检查网络或服务器'
		}
		uni.$u.toast(errorData)
		return Promise.reject(response)
	})

	function handleAuthorized(data) {
		uni.$u.throttle(() => {
			uni.reLaunch({
				url: '/pages/index/index'
			});
		}, 1000 * 10)
		return data
	}
}